package com.caseprocessing.enhanced;

import com.caseprocessing.ai.language.SemanticResultModels.*;
import com.caseprocessing.ai.vision.VisionResultModels.*;
import com.caseprocessing.model.DocumentType;
import com.caseprocessing.service.LegalCitationValidator.LegalCitationResult;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * AI增强合规检查相关的数据模型
 */
public class ComplianceModels {
    
    /**
     * AI合规检查结果
     */
    public static class AIComplianceResult {
        private double overallComplianceScore;
        private List<ComplianceIssue> identifiedIssues;
        private List<String> recommendations;
        private ComplianceRiskLevel riskLevel;
        private double confidence;
        private ComplianceStrategy appliedStrategy;
        private LocalDateTime analysisTimestamp;
        
        public AIComplianceResult() {
            this.analysisTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public double getOverallComplianceScore() { return overallComplianceScore; }
        public void setOverallComplianceScore(double overallComplianceScore) { this.overallComplianceScore = overallComplianceScore; }
        
        public List<ComplianceIssue> getIdentifiedIssues() { return identifiedIssues; }
        public void setIdentifiedIssues(List<ComplianceIssue> identifiedIssues) { this.identifiedIssues = identifiedIssues; }
        
        public List<String> getRecommendations() { return recommendations; }
        public void setRecommendations(List<String> recommendations) { this.recommendations = recommendations; }
        
        public ComplianceRiskLevel getRiskLevel() { return riskLevel; }
        public void setRiskLevel(ComplianceRiskLevel riskLevel) { this.riskLevel = riskLevel; }
        
        public double getConfidence() { return confidence; }
        public void setConfidence(double confidence) { this.confidence = confidence; }
        
        public ComplianceStrategy getAppliedStrategy() { return appliedStrategy; }
        public void setAppliedStrategy(ComplianceStrategy appliedStrategy) { this.appliedStrategy = appliedStrategy; }
        
        public LocalDateTime getAnalysisTimestamp() { return analysisTimestamp; }
    }
    
    /**
     * 合规问题
     */
    public static class ComplianceIssue {
        private String issueId;
        private String issueType;
        private String description;
        private String severity;
        private double confidence;
        private String source; // TRADITIONAL, SEMANTIC, VISUAL, CITATION
        private List<String> affectedElements;
        private String recommendedAction;
        private String legalBasis;
        
        public ComplianceIssue() {}
        
        public ComplianceIssue(String issueType, String description, String severity) {
            this.issueId = java.util.UUID.randomUUID().toString();
            this.issueType = issueType;
            this.description = description;
            this.severity = severity;
            this.confidence = 0.8;
        }
        
        // Getters and setters
        public String getIssueId() { return issueId; }
        public void setIssueId(String issueId) { this.issueId = issueId; }
        
        public String getIssueType() { return issueType; }
        public void setIssueType(String issueType) { this.issueType = issueType; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getSeverity() { return severity; }
        public void setSeverity(String severity) { this.severity = severity; }
        
        public double getConfidence() { return confidence; }
        public void setConfidence(double confidence) { this.confidence = confidence; }
        
        public String getSource() { return source; }
        public void setSource(String source) { this.source = source; }
        
        public List<String> getAffectedElements() { return affectedElements; }
        public void setAffectedElements(List<String> affectedElements) { this.affectedElements = affectedElements; }
        
        public String getRecommendedAction() { return recommendedAction; }
        public void setRecommendedAction(String recommendedAction) { this.recommendedAction = recommendedAction; }
        
        public String getLegalBasis() { return legalBasis; }
        public void setLegalBasis(String legalBasis) { this.legalBasis = legalBasis; }
    }
    
    /**
     * 合规风险等级
     */
    public enum ComplianceRiskLevel {
        LOW("低风险", 0.8),
        MEDIUM("中风险", 0.6),
        HIGH("高风险", 0.4),
        CRITICAL("严重风险", 0.2);
        
        private final String description;
        private final double threshold;
        
        ComplianceRiskLevel(String description, double threshold) {
            this.description = description;
            this.threshold = threshold;
        }
        
        public String getDescription() { return description; }
        public double getThreshold() { return threshold; }
        
        public static ComplianceRiskLevel fromScore(double score) {
            if (score >= LOW.threshold) return LOW;
            if (score >= MEDIUM.threshold) return MEDIUM;
            if (score >= HIGH.threshold) return HIGH;
            return CRITICAL;
        }
    }
    
    /**
     * 合规策略
     */
    public static class ComplianceStrategy {
        private DocumentType documentType;
        private List<String> focusAreas;
        private double semanticWeight;
        private double traditionalWeight;
        private double visualWeight;
        private double citationWeight;
        private List<String> legalStandards;
        private Map<String, Object> customParameters;
        
        public ComplianceStrategy() {
            // 默认权重
            this.semanticWeight = 0.35;
            this.traditionalWeight = 0.35;
            this.visualWeight = 0.2;
            this.citationWeight = 0.1;
        }
        
        // Getters and setters
        public DocumentType getDocumentType() { return documentType; }
        public void setDocumentType(DocumentType documentType) { this.documentType = documentType; }
        
        public List<String> getFocusAreas() { return focusAreas; }
        public void setFocusAreas(List<String> focusAreas) { this.focusAreas = focusAreas; }
        
        public double getSemanticWeight() { return semanticWeight; }
        public void setSemanticWeight(double semanticWeight) { this.semanticWeight = semanticWeight; }
        
        public double getTraditionalWeight() { return traditionalWeight; }
        public void setTraditionalWeight(double traditionalWeight) { this.traditionalWeight = traditionalWeight; }
        
        public double getVisualWeight() { return visualWeight; }
        public void setVisualWeight(double visualWeight) { this.visualWeight = visualWeight; }
        
        public double getCitationWeight() { return citationWeight; }
        public void setCitationWeight(double citationWeight) { this.citationWeight = citationWeight; }
        
        public List<String> getLegalStandards() { return legalStandards; }
        public void setLegalStandards(List<String> legalStandards) { this.legalStandards = legalStandards; }
        
        public Map<String, Object> getCustomParameters() { return customParameters; }
        public void setCustomParameters(Map<String, Object> customParameters) { this.customParameters = customParameters; }
    }
    
    /**
     * 传统合规检查结果包装
     */
    public static class TraditionalComplianceResult {
        private Object originalResult;
        private double complianceScore;
        private List<String> issues;
        
        public TraditionalComplianceResult(Object originalResult) {
            this.originalResult = originalResult;
            this.complianceScore = 0.8; // 默认评分
        }
        
        // Getters and setters
        public Object getOriginalResult() { return originalResult; }
        public double getComplianceScore() { return complianceScore; }
        public void setComplianceScore(double complianceScore) { this.complianceScore = complianceScore; }
        
        public List<String> getIssues() { return issues; }
        public void setIssues(List<String> issues) { this.issues = issues; }
    }
    
    /**
     * 语义合规检查结果包装
     */
    public static class SemanticComplianceResult {
        private ComplianceReasoningResult reasoningResult;
        private double complianceScore;
        
        public SemanticComplianceResult(ComplianceReasoningResult reasoningResult) {
            this.reasoningResult = reasoningResult;
            this.complianceScore = calculateScoreFromReasoning(reasoningResult);
        }
        
        private double calculateScoreFromReasoning(ComplianceReasoningResult result) {
            // 基于推理结果计算合规评分
            if (result.getComplianceAssessment() != null) {
                return result.getComplianceAssessment().getComplianceScore();
            }
            return 0.7; // 默认评分
        }
        
        // Getters and setters
        public ComplianceReasoningResult getReasoningResult() { return reasoningResult; }
        public double getComplianceScore() { return complianceScore; }
    }
    
    /**
     * 视觉合规检查结果包装
     */
    public static class VisualComplianceResult {
        private SealSignatureResult sealSignatureResult;
        private double complianceScore;
        
        public VisualComplianceResult(SealSignatureResult sealSignatureResult) {
            this.sealSignatureResult = sealSignatureResult;
            this.complianceScore = calculateScoreFromVisual(sealSignatureResult);
        }
        
        private double calculateScoreFromVisual(SealSignatureResult result) {
            if (result == null) return 0.8; // 没有图像时的默认评分
            
            // 基于印章签名质量计算合规评分
            if (result.getQualitySummary() != null) {
                double sealQuality = result.getQualitySummary().getSealQualityAvg();
                double signatureQuality = result.getQualitySummary().getSignatureQualityAvg();
                return (sealQuality + signatureQuality) / 2.0;
            }
            return 0.8;
        }
        
        // Getters and setters
        public SealSignatureResult getSealSignatureResult() { return sealSignatureResult; }
        public double getComplianceScore() { return complianceScore; }
    }
    
    /**
     * 合规风险评估
     */
    public static class ComplianceRiskAssessment {
        private int totalDocuments;
        private int highRiskCount;
        private int mediumRiskCount;
        private int lowRiskCount;
        private double averageComplianceScore;
        private List<String> systemicRisks;
        private ComplianceRiskLevel overallRiskLevel;
        private LocalDateTime assessmentTimestamp;
        
        public ComplianceRiskAssessment() {
            this.assessmentTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public int getTotalDocuments() { return totalDocuments; }
        public void setTotalDocuments(int totalDocuments) { this.totalDocuments = totalDocuments; }
        
        public int getHighRiskCount() { return highRiskCount; }
        public void setHighRiskCount(int highRiskCount) { this.highRiskCount = highRiskCount; }
        
        public int getMediumRiskCount() { return mediumRiskCount; }
        public void setMediumRiskCount(int mediumRiskCount) { this.mediumRiskCount = mediumRiskCount; }
        
        public int getLowRiskCount() { return lowRiskCount; }
        public void setLowRiskCount(int lowRiskCount) { this.lowRiskCount = lowRiskCount; }
        
        public double getAverageComplianceScore() { return averageComplianceScore; }
        public void setAverageComplianceScore(double averageComplianceScore) { this.averageComplianceScore = averageComplianceScore; }
        
        public List<String> getSystemicRisks() { return systemicRisks; }
        public void setSystemicRisks(List<String> systemicRisks) { this.systemicRisks = systemicRisks; }
        
        public ComplianceRiskLevel getOverallRiskLevel() { return overallRiskLevel; }
        public void setOverallRiskLevel(ComplianceRiskLevel overallRiskLevel) { this.overallRiskLevel = overallRiskLevel; }
        
        public LocalDateTime getAssessmentTimestamp() { return assessmentTimestamp; }
    }
    
    /**
     * 合规改进计划
     */
    public static class ComplianceImprovementPlan {
        private AIComplianceResult complianceResult;
        private ImprovementSuggestionResult improvementSuggestions;
        private List<ActionItem> actionItems;
        private String priority;
        private LocalDateTime generationTimestamp;
        
        public ComplianceImprovementPlan() {
            this.generationTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public AIComplianceResult getComplianceResult() { return complianceResult; }
        public void setComplianceResult(AIComplianceResult complianceResult) { this.complianceResult = complianceResult; }
        
        public ImprovementSuggestionResult getImprovementSuggestions() { return improvementSuggestions; }
        public void setImprovementSuggestions(ImprovementSuggestionResult improvementSuggestions) { this.improvementSuggestions = improvementSuggestions; }
        
        public List<ActionItem> getActionItems() { return actionItems; }
        public void setActionItems(List<ActionItem> actionItems) { this.actionItems = actionItems; }
        
        public String getPriority() { return priority; }
        public void setPriority(String priority) { this.priority = priority; }
        
        public LocalDateTime getGenerationTimestamp() { return generationTimestamp; }
        public void setGenerationTimestamp(LocalDateTime generationTimestamp) { this.generationTimestamp = generationTimestamp; }
    }
    
    /**
     * 行动项
     */
    public static class ActionItem {
        private String id;
        private String title;
        private String description;
        private String priority;
        private String status;
        private LocalDateTime deadline;
        private String assignee;
        private List<String> dependencies;
        
        public ActionItem() {
            this.id = java.util.UUID.randomUUID().toString();
            this.status = "PENDING";
        }
        
        // Getters and setters
        public String getId() { return id; }
        public void setId(String id) { this.id = id; }
        
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        
        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }
        
        public String getPriority() { return priority; }
        public void setPriority(String priority) { this.priority = priority; }
        
        public String getStatus() { return status; }
        public void setStatus(String status) { this.status = status; }
        
        public LocalDateTime getDeadline() { return deadline; }
        public void setDeadline(LocalDateTime deadline) { this.deadline = deadline; }
        
        public String getAssignee() { return assignee; }
        public void setAssignee(String assignee) { this.assignee = assignee; }
        
        public List<String> getDependencies() { return dependencies; }
        public void setDependencies(List<String> dependencies) { this.dependencies = dependencies; }
    }
    
    /**
     * 合规指标
     */
    public static class ComplianceMetrics {
        private String documentId;
        private DocumentType documentType;
        private double complianceScore;
        private int issueCount;
        private ComplianceRiskLevel riskLevel;
        private LocalDateTime processingTimestamp;
        
        public ComplianceMetrics() {
            this.processingTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public String getDocumentId() { return documentId; }
        public void setDocumentId(String documentId) { this.documentId = documentId; }
        
        public DocumentType getDocumentType() { return documentType; }
        public void setDocumentType(DocumentType documentType) { this.documentType = documentType; }
        
        public double getComplianceScore() { return complianceScore; }
        public void setComplianceScore(double complianceScore) { this.complianceScore = complianceScore; }
        
        public int getIssueCount() { return issueCount; }
        public void setIssueCount(int issueCount) { this.issueCount = issueCount; }
        
        public ComplianceRiskLevel getRiskLevel() { return riskLevel; }
        public void setRiskLevel(ComplianceRiskLevel riskLevel) { this.riskLevel = riskLevel; }
        
        public LocalDateTime getProcessingTimestamp() { return processingTimestamp; }
        public void setProcessingTimestamp(LocalDateTime processingTimestamp) { this.processingTimestamp = processingTimestamp; }
    }
    
    /**
     * 合规监控配置
     */
    public static class ComplianceMonitoringConfig {
        private String monitoringLevel; // BASIC, DETAILED, COMPREHENSIVE
        private List<String> focusAreas;
        private double alertThreshold;
        private int reportingInterval; // 小时
        private boolean enableRealTimeAlerts;
        private List<String> notificationRecipients;
        
        public ComplianceMonitoringConfig() {
            this.monitoringLevel = "DETAILED";
            this.alertThreshold = 0.7;
            this.reportingInterval = 24;
            this.enableRealTimeAlerts = true;
        }
        
        // Getters and setters
        public String getMonitoringLevel() { return monitoringLevel; }
        public void setMonitoringLevel(String monitoringLevel) { this.monitoringLevel = monitoringLevel; }
        
        public List<String> getFocusAreas() { return focusAreas; }
        public void setFocusAreas(List<String> focusAreas) { this.focusAreas = focusAreas; }
        
        public double getAlertThreshold() { return alertThreshold; }
        public void setAlertThreshold(double alertThreshold) { this.alertThreshold = alertThreshold; }
        
        public int getReportingInterval() { return reportingInterval; }
        public void setReportingInterval(int reportingInterval) { this.reportingInterval = reportingInterval; }
        
        public boolean isEnableRealTimeAlerts() { return enableRealTimeAlerts; }
        public void setEnableRealTimeAlerts(boolean enableRealTimeAlerts) { this.enableRealTimeAlerts = enableRealTimeAlerts; }
        
        public List<String> getNotificationRecipients() { return notificationRecipients; }
        public void setNotificationRecipients(List<String> notificationRecipients) { this.notificationRecipients = notificationRecipients; }
    }
    
    /**
     * 合规监控结果
     */
    public static class ComplianceMonitoringResult {
        private List<ComplianceMetrics> metrics;
        private ComplianceMonitoringConfig monitoringConfig;
        private ComplianceTrends trends;
        private List<ComplianceAlert> alerts;
        private LocalDateTime reportTimestamp;
        
        public ComplianceMonitoringResult() {
            this.reportTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public List<ComplianceMetrics> getMetrics() { return metrics; }
        public void setMetrics(List<ComplianceMetrics> metrics) { this.metrics = metrics; }
        
        public ComplianceMonitoringConfig getMonitoringConfig() { return monitoringConfig; }
        public void setMonitoringConfig(ComplianceMonitoringConfig monitoringConfig) { this.monitoringConfig = monitoringConfig; }
        
        public ComplianceTrends getTrends() { return trends; }
        public void setTrends(ComplianceTrends trends) { this.trends = trends; }
        
        public List<ComplianceAlert> getAlerts() { return alerts; }
        public void setAlerts(List<ComplianceAlert> alerts) { this.alerts = alerts; }
        
        public LocalDateTime getReportTimestamp() { return reportTimestamp; }
        public void setReportTimestamp(LocalDateTime reportTimestamp) { this.reportTimestamp = reportTimestamp; }
    }
    
    /**
     * 合规趋势
     */
    public static class ComplianceTrends {
        private Map<String, Double> scoreHistory;
        private Map<String, Integer> issueCountHistory;
        private List<String> improvingAreas;
        private List<String> decliningAreas;
        private double overallTrend; // 正值表示改善，负值表示恶化
        
        public ComplianceTrends() {}
        
        // Getters and setters
        public Map<String, Double> getScoreHistory() { return scoreHistory; }
        public void setScoreHistory(Map<String, Double> scoreHistory) { this.scoreHistory = scoreHistory; }
        
        public Map<String, Integer> getIssueCountHistory() { return issueCountHistory; }
        public void setIssueCountHistory(Map<String, Integer> issueCountHistory) { this.issueCountHistory = issueCountHistory; }
        
        public List<String> getImprovingAreas() { return improvingAreas; }
        public void setImprovingAreas(List<String> improvingAreas) { this.improvingAreas = improvingAreas; }
        
        public List<String> getDecliningAreas() { return decliningAreas; }
        public void setDecliningAreas(List<String> decliningAreas) { this.decliningAreas = decliningAreas; }
        
        public double getOverallTrend() { return overallTrend; }
        public void setOverallTrend(double overallTrend) { this.overallTrend = overallTrend; }
    }
    
    /**
     * 合规警报
     */
    public static class ComplianceAlert {
        private String alertId;
        private String alertType;
        private String severity;
        private String message;
        private String documentId;
        private LocalDateTime alertTimestamp;
        private boolean acknowledged;
        
        public ComplianceAlert() {
            this.alertId = java.util.UUID.randomUUID().toString();
            this.alertTimestamp = LocalDateTime.now();
            this.acknowledged = false;
        }
        
        // Getters and setters
        public String getAlertId() { return alertId; }
        public void setAlertId(String alertId) { this.alertId = alertId; }
        
        public String getAlertType() { return alertType; }
        public void setAlertType(String alertType) { this.alertType = alertType; }
        
        public String getSeverity() { return severity; }
        public void setSeverity(String severity) { this.severity = severity; }
        
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        
        public String getDocumentId() { return documentId; }
        public void setDocumentId(String documentId) { this.documentId = documentId; }
        
        public LocalDateTime getAlertTimestamp() { return alertTimestamp; }
        public void setAlertTimestamp(LocalDateTime alertTimestamp) { this.alertTimestamp = alertTimestamp; }
        
        public boolean isAcknowledged() { return acknowledged; }
        public void setAcknowledged(boolean acknowledged) { this.acknowledged = acknowledged; }
    }
    
    /**
     * 批量处理配置
     */
    public static class BatchProcessingConfig {
        private int batchSize;
        private int maxConcurrency;
        private boolean enableProgressTracking;
        private String processingPriority;
        private Map<String, Object> customSettings;
        
        public BatchProcessingConfig() {
            this.batchSize = 10;
            this.maxConcurrency = 5;
            this.enableProgressTracking = true;
            this.processingPriority = "NORMAL";
        }
        
        // Getters and setters
        public int getBatchSize() { return batchSize; }
        public void setBatchSize(int batchSize) { this.batchSize = batchSize; }
        
        public int getMaxConcurrency() { return maxConcurrency; }
        public void setMaxConcurrency(int maxConcurrency) { this.maxConcurrency = maxConcurrency; }
        
        public boolean isEnableProgressTracking() { return enableProgressTracking; }
        public void setEnableProgressTracking(boolean enableProgressTracking) { this.enableProgressTracking = enableProgressTracking; }
        
        public String getProcessingPriority() { return processingPriority; }
        public void setProcessingPriority(String processingPriority) { this.processingPriority = processingPriority; }
        
        public Map<String, Object> getCustomSettings() { return customSettings; }
        public void setCustomSettings(Map<String, Object> customSettings) { this.customSettings = customSettings; }
    }
    
    /**
     * 批量合规结果
     */
    public static class BatchComplianceResult {
        private int totalProcessed;
        private BatchProcessingConfig processingConfig;
        private List<AIComplianceResult> results;
        private double averageComplianceScore;
        private Map<ComplianceRiskLevel, Long> riskDistribution;
        private List<String> batchInsights;
        private LocalDateTime processingTimestamp;
        
        public BatchComplianceResult() {
            this.processingTimestamp = LocalDateTime.now();
        }
        
        // Getters and setters
        public int getTotalProcessed() { return totalProcessed; }
        public void setTotalProcessed(int totalProcessed) { this.totalProcessed = totalProcessed; }
        
        public BatchProcessingConfig getProcessingConfig() { return processingConfig; }
        public void setProcessingConfig(BatchProcessingConfig processingConfig) { this.processingConfig = processingConfig; }
        
        public List<AIComplianceResult> getResults() { return results; }
        public void setResults(List<AIComplianceResult> results) { this.results = results; }
        
        public double getAverageComplianceScore() { return averageComplianceScore; }
        public void setAverageComplianceScore(double averageComplianceScore) { this.averageComplianceScore = averageComplianceScore; }
        
        public Map<ComplianceRiskLevel, Long> getRiskDistribution() { return riskDistribution; }
        public void setRiskDistribution(Map<ComplianceRiskLevel, Long> riskDistribution) { this.riskDistribution = riskDistribution; }
        
        public List<String> getBatchInsights() { return batchInsights; }
        public void setBatchInsights(List<String> batchInsights) { this.batchInsights = batchInsights; }
        
        public LocalDateTime getProcessingTimestamp() { return processingTimestamp; }
        public void setProcessingTimestamp(LocalDateTime processingTimestamp) { this.processingTimestamp = processingTimestamp; }
    }
    
    /**
     * 合规配置
     */
    public static class ComplianceConfig {
        private double traditionalWeight;
        private double semanticWeight;
        private double visualWeight;
        private double citationWeight;
        private double confidenceThreshold;
        private boolean enableAdaptiveWeighting;
        private Map<DocumentType, ComplianceStrategy> typeSpecificStrategies;
        
        public ComplianceConfig() {
            this.traditionalWeight = 0.35;
            this.semanticWeight = 0.35;
            this.visualWeight = 0.2;
            this.citationWeight = 0.1;
            this.confidenceThreshold = 0.7;
            this.enableAdaptiveWeighting = true;
        }
        
        // Getters and setters
        public double getTraditionalWeight() { return traditionalWeight; }
        public void setTraditionalWeight(double traditionalWeight) { this.traditionalWeight = traditionalWeight; }
        
        public double getSemanticWeight() { return semanticWeight; }
        public void setSemanticWeight(double semanticWeight) { this.semanticWeight = semanticWeight; }
        
        public double getVisualWeight() { return visualWeight; }
        public void setVisualWeight(double visualWeight) { this.visualWeight = visualWeight; }
        
        public double getCitationWeight() { return citationWeight; }
        public void setCitationWeight(double citationWeight) { this.citationWeight = citationWeight; }
        
        public double getConfidenceThreshold() { return confidenceThreshold; }
        public void setConfidenceThreshold(double confidenceThreshold) { this.confidenceThreshold = confidenceThreshold; }
        
        public boolean isEnableAdaptiveWeighting() { return enableAdaptiveWeighting; }
        public void setEnableAdaptiveWeighting(boolean enableAdaptiveWeighting) { this.enableAdaptiveWeighting = enableAdaptiveWeighting; }
        
        public Map<DocumentType, ComplianceStrategy> getTypeSpecificStrategies() { return typeSpecificStrategies; }
        public void setTypeSpecificStrategies(Map<DocumentType, ComplianceStrategy> typeSpecificStrategies) { this.typeSpecificStrategies = typeSpecificStrategies; }
    }
}